<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="olqvb" id="olqvb"><span data-lake-id="u2ffec76c" id="u2ffec76c">典型回答</span></h1>
  <p data-lake-id="u012b43b8" id="u012b43b8"><br></p>
  <p data-lake-id="ud696027e" id="ud696027e"><span data-lake-id="u29ad73a0" id="u29ad73a0">在公司间进行数据交互时，无论是通过HTTP接口还是文件传输，我们都需要关注交互过程的安全性、准确性和效率、以及合规性等问题。</span></p>
  <p data-lake-id="u322affb3" id="u322affb3"><span data-lake-id="u9ab7328d" id="u9ab7328d">​</span><br></p>
  <h3 data-lake-id="HRNBn" id="HRNBn"><span data-lake-id="uacbde42f" id="uacbde42f" style="color: var(--tw-prose-headings)">安全性</span></h3>
  <p data-lake-id="ub577fd2d" id="ub577fd2d"><br></p>
  <p data-lake-id="u85a7aeaa" id="u85a7aeaa"><span data-lake-id="u76990f21" id="u76990f21">数据交互的安全性至关重要，如何避免双方的交互数据被别人窃取到，如何防止数据泄露都是我们需要关注的。一般来说都需要在接口中进行加解密和加签验签。</span></p>
  <p data-lake-id="u001f827f" id="u001f827f"><br></p>
  <ol list="u179c8e67">
   <li fid="ud84b749c" data-lake-id="uec4ff99d" id="uec4ff99d"><strong><span data-lake-id="u88132b1a" id="u88132b1a">协议加密：</span></strong></li>
  </ol>
  <ul list="u1f3103f5" data-lake-indent="1">
   <li fid="ue8f703bc" data-lake-id="u7de5390a" id="u7de5390a"><span data-lake-id="u9ba57096" id="u9ba57096">在数据传输时，需要确保数据在传输过程中不被窃取或篡改。如果是Restful交互应该优先使用HTTPS协议而不是HTTP协议。对于文件传输，可以考虑使用安全的文件传输协议如SFTP或FTPS，或在传输前对文件进行加密。</span></li>
  </ul>
  <ol list="u179c8e67" start="2">
   <li fid="ud84b749c" data-lake-id="u2ba4e703" id="u2ba4e703"><strong><span data-lake-id="u678e1587" id="u678e1587">数据加密：</span></strong></li>
  </ol>
  <ul list="u0d1b7a15" data-lake-indent="1">
   <li fid="ue8f703bc" data-lake-id="u313f3808" id="u313f3808"><span data-lake-id="ub48d2bc0" id="ub48d2bc0">不仅要对协议进行加密，敏感数据也需要进行加密，比如手机号、身份证号等，都需要用加密算法进行加密。</span></li>
   <li fid="ue8f703bc" data-lake-id="u4a1d236e" id="u4a1d236e"><span data-lake-id="u646615e3" id="u646615e3">发送方在发送数据之前，使用密钥将数据转换成不可读的格式（密文）。接收方使用密钥将密文转换回原始数据（明文）</span></li>
   <li fid="ue8f703bc" data-lake-id="ua08d3529" id="ua08d3529"><span data-lake-id="u92219967" id="u92219967">加密可以用对称加密，也可以用非对称加密。不管是哪种加密，公钥秘钥都是提前约定好的。</span></li>
  </ul>
  <p data-lake-id="u3fd86bb6" id="u3fd86bb6"><span data-lake-id="uae505b7d" id="uae505b7d">​</span><br></p>
  <pre lang="java"><code>
//双方约定好的加密key
String key = "1234567887654321";

//使用AES进行加密
AES aes = SecureUtil.aes(key.getBytes());
String encryptedData = aes.encryptBase64(originalData);
</code></pre>
  <p data-lake-id="ud482aca0" id="ud482aca0"><br></p>
  <pre lang="java"><code>
//双方约定好的加密key
String key = "1234567887654321";

AES aes = SecureUtil.aes(key.getBytes());
String decryptedData = aes.decryptStr(encryptedData);
</code></pre>
  <p data-lake-id="ua8eedaf4" id="ua8eedaf4"><span data-lake-id="udf3ce4b6" id="udf3ce4b6">​</span><br></p>
  <ol list="u179c8e67" start="3">
   <li fid="ud84b749c" data-lake-id="u48e67255" id="u48e67255"><strong><span data-lake-id="u1a8b41d6" id="u1a8b41d6">加签验签：</span></strong></li>
  </ol>
  <ul list="u8fc6c151" data-lake-indent="1">
   <li fid="u3df6994a" data-lake-id="u4f12058d" id="u4f12058d"><span data-lake-id="u7de85ca7" id="u7de85ca7">加签验签的主要目的是保证数据的完整性和确认发送方的身份，确保数据在传输过程中未被篡改，并且是由可信的发送方发送的。</span></li>
   <li fid="u3df6994a" data-lake-id="u356f0222" id="u356f0222"><span data-lake-id="u41c96f14" id="u41c96f14">发送方使用密钥对数据（通常是数据的哈希值）进行签名，然后将签名附加到数据上发送。接收方使用相应的密钥验证签名的有效性，以确认数据的完整性和发送方的身份。</span></li>
   <li fid="u3df6994a" data-lake-id="u0309f7dc" id="u0309f7dc"><span data-lake-id="ud8beba8e" id="ud8beba8e">通常来说，双方会约定对一些关键字段做加签，并且大多数都是使用带盐的加签算法。</span></li>
  </ul>
  <p data-lake-id="ubf81adae" id="ubf81adae"><span data-lake-id="ue19da63f" id="ue19da63f">​</span><br></p>
  <pre lang="java"><code>
// 使用RSA加签
String privateKeyBase64 = "HollisTestKey"; 
RSA rsa = new RSA(privateKeyBase64, null);
String signature = rsa.signBase64(encryptedData, KeyType.PrivateKey);

</code></pre>
  <p data-lake-id="ub1ddcb0e" id="ub1ddcb0e"><br></p>
  <pre lang="java"><code>
// 使用RSA验签
String signature = "";//这里需要从请求中解析出signature
String publicKeyBase64 = "HollisTestKey";
RSA rsa = new RSA(null, publicKeyBase64);
boolean isCorrect = rsa.verify(encryptedData, KeyType.PublicKey, signature);
</code></pre>
  <p data-lake-id="udb896558" id="udb896558"><span data-lake-id="u8681728b" id="u8681728b">​</span><br></p>
  <ol list="u179c8e67" start="4">
   <li fid="ud84b749c" data-lake-id="u5fa5bb24" id="u5fa5bb24"><strong><span data-lake-id="ud5f53096" id="ud5f53096">身份验证和授权：</span></strong></li>
  </ol>
  <ul list="u3f18f144" data-lake-indent="1">
   <li fid="u32b017ee" data-lake-id="ueac2ce0e" id="ueac2ce0e"><span data-lake-id="ud5c6dc85" id="ud5c6dc85">对于接口调用，需要进行鉴权，确保调用者有API的访问权限，这时候就需要做授权校验了，这里可以使用 API 密钥或 OAuth 令牌、以及白名单等。</span></li>
  </ul>
  <ol list="u179c8e67" start="5">
   <li fid="ud84b749c" data-lake-id="u13e0b0cc" id="u13e0b0cc"><strong><span data-lake-id="ufb5fe181" id="ufb5fe181">文件完整性校验</span></strong></li>
  </ol>
  <ul list="u51ec5bd4" data-lake-indent="1">
   <li fid="u32b017ee" data-lake-id="ua17d7a6a" id="ua17d7a6a"><span data-lake-id="u2e9bfc8e" id="u2e9bfc8e">如果是文件传输，一般都是直接取sftp上获取文件，这时候为了确保文件的完整性以及未被篡改，都需要做一些校验，比如说对文件做MD5，然后把MD5和文件名单独通过接口发送。接收方在拉取到文件之后自己计算出MD5，再和接口传输过来的MD5做校验即可。</span></li>
  </ul>
  <ol list="u179c8e67" start="6">
   <li fid="ud84b749c" data-lake-id="ue619a969" id="ue619a969"><strong><span data-lake-id="ucc624e0a" id="ucc624e0a">区块链</span></strong></li>
  </ol>
  <ul list="u563c63aa" data-lake-indent="1">
   <li fid="u1fdc288c" data-lake-id="uc0d9e38e" id="uc0d9e38e"><span data-lake-id="u35381d3d" id="u35381d3d">再有一些金融场景中，也会通过区块链的方式进行数据传输，通常是联盟链。区块链提供了一个分布式的、去中心化的数据库或账本，其中的记录一旦被添加就无法被更改或删除。</span></li>
  </ul>
  <h3 data-lake-id="U6Jsp" id="U6Jsp"><span data-lake-id="u4496d9f2" id="u4496d9f2">传输效率</span></h3>
  <p data-lake-id="u02862116" id="u02862116"><br></p>
  <p data-lake-id="ud0d45464" id="ud0d45464"><span data-lake-id="u8be16642" id="u8be16642">接口传输的时候，需要保证传输效率，那么我们可以有以下手段来保障：</span></p>
  <p data-lake-id="ue53ed3da" id="ue53ed3da"><br></p>
  <ol list="ubd607419">
   <li fid="u3c2c9672" data-lake-id="u66f96e4a" id="u66f96e4a"><strong><span data-lake-id="u1b18e1cd" id="u1b18e1cd">专线</span></strong><span data-lake-id="uc4bfb722" id="uc4bfb722">：使用专线进行与外部机构的接口交互也是一个很好的提升性能和安全性的方案。专线，即专用网络连接。专线提供了比公共互联网更高的带宽和更低的延迟。专线通常也比公共互联网更稳定可靠，减少了因网络拥堵或其他因素导致的数据传输中断和延迟的风险。而且专线提供了更加安全的数据传输通道，因为数据不会经过公共互联网，从而减少了数据被拦截和窃取的风险。但是专线的缺点就是成本高，</span></li>
   <li fid="u3c2c9672" data-lake-id="ue184ca12" id="ue184ca12"><strong><span data-lake-id="u36511b9b" id="u36511b9b">数据压缩</span></strong><span data-lake-id="u6ae78cc2" id="u6ae78cc2">：有的时候数据比较多的时候，可以做一些适当的数据压缩，减少数据量来提升性能。</span></li>
   <li fid="u3c2c9672" data-lake-id="u9bb4aea8" id="u9bb4aea8"><strong><span data-lake-id="u60b5799d" id="u60b5799d">用url代替文件内容</span></strong><span data-lake-id="u10c8a70f" id="u10c8a70f">：</span></li>
  </ol>
  <ul list="udd1cab6b" data-lake-indent="1">
   <li fid="u723a1719" data-lake-id="u3fb38b7c" id="u3fb38b7c"><span data-lake-id="u13035614" id="u13035614">有的时候我们接口交互中可能有图片，这时候如果直接传输图片的BASE64可能会比较大，那么就可以考虑先把文件上传到OSS等文件存储上，然后传输一个URL地址即可。这样接收方获取到地址之后自己去下载就行了。</span></li>
  </ul>
  <p data-lake-id="ue2813314" id="ue2813314"><span data-lake-id="u4b404b82" id="u4b404b82">​</span><br></p>
  <h3 data-lake-id="JKxAD" id="JKxAD"><span data-lake-id="u1808bd3b" id="u1808bd3b">合规性</span></h3>
  <p data-lake-id="u6dec9991" id="u6dec9991"><span data-lake-id="u645d4334" id="u645d4334">​</span><br></p>
  <p data-lake-id="u85109877" id="u85109877"><span data-lake-id="uffa50837" id="uffa50837">数据合规，现在真的非常非常重要了，有很多时候，我们的数据涉及到用户的个人隐私数据，就需要考虑一些数据合规的处理，这些隐私数据，如果没有用户授权，是不可以提供给第三方的。也就是说是不能传输的。那怎么办呢？</span></p>
  <p data-lake-id="ud1e74861" id="ud1e74861"><span data-lake-id="u5d3a3fe4" id="u5d3a3fe4">​</span><br></p>
  <ol list="u3d531832">
   <li fid="udea5e345" data-lake-id="uf3214c75" id="uf3214c75"><strong><span data-lake-id="ub70e9483" id="ub70e9483">隐私计算：</span></strong><span data-lake-id="ub1f6b225" id="ub1f6b225">通过数据可用不可见的方式帮助我们进行跨机构间的数据协同。</span></li>
  </ol>
  <p data-lake-id="u96cc5f9d" id="u96cc5f9d"><span data-lake-id="uddbd8e26" id="uddbd8e26">​</span><br></p>
  <p data-lake-id="u08bc1387" id="u08bc1387"><span data-lake-id="uc7d8b440" id="uc7d8b440"><br><br></span></p>
  <p data-lake-id="u47f849a5" id="u47f849a5"><span data-lake-id="ue4f46b61" id="ue4f46b61">​</span><br></p>
  <p data-lake-id="u0710f109" id="u0710f109"><span data-lake-id="uba7a171e" id="uba7a171e">​</span><br></p>
 </body>
</html>